﻿ #define _CRT_SECURE_NO_WARNINGS 1
//#include <iostream>
//using namespace std;
//
//class A
//{
//public:
//	virtual void fun()
//	{
//		cout << "A";
//	}
//};
//
//class B : public A
//{
//public:
//	void fun()
//	{
//		cout << "B";
//	}
//};
//
//int main()
//{
//	A* a = new B();
//	a->fun();
//	return 0;
//}

//// 移动构造函数和赋值
//#include <iostream>
//#include <string>
//using namespace std;
//class Example6 {
//	string* ptr;
//public:
//	Example6(const string& str) : ptr(new string(str)) {}
//	~Example6() { delete ptr; }
//	// 移动构造函数，参数x不能是const Pointer&& x，
//	// 因为要改变x的成员数据的值；
//	// C++98不支持，C++0x（C++11）支持
//	Example6(Example6&& x) : ptr(x.ptr)
//	{
//		x.ptr = nullptr;
//	}
//	// move assignment
//	Example6& operator= (Example6&& x)
//	{
//		delete ptr;
//		ptr = x.ptr;
//		x.ptr = nullptr;
//		return *this;
//	}
//	// access content:
//	const string& content() const { return *ptr; }
//	// addition:
//	Example6 operator+(const Example6& rhs)
//	{
//		return Example6(content() + rhs.content()); 
//	}
//};
//int main() {
//	Example6 foo("Exam"); // 构造函数
//	Example6 bar = Example6("ple"); // 拷贝构造函数
//	// Example6 bar(move(foo)); // 移动构造函数
//	// 调用move之后，foo变为一个右值引用变量，
//	// 此时，foo所指向的字符串已经被"掏空"，
//	// 所以此时不能再调用foo
//	foo = foo + bar; // 移动赋值，在这儿"="号右边的加法操作，
//	// 产生一个临时值，即一个右值
//    // 所以此时调用移动赋值语句
//	cout << "foo's content: " << foo.content() << '\n';
//	return 0;
//}

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main()
{
	//创建并初始化一个 unordered_map 容器，其存储的 <string,string> 类型的键值对
	unordered_map<string, string> my_uMap{
		{"教程1", "www.123.com"},
		{"教程2", "www.234.com"},
		{"教程3", "www.345.com"}
	};
		//查找指定键对应的值，效率比关联式容器高
		string str = my_uMap.at("教程1");
		cout << "str = " << str << endl;
		//使用迭代器遍历哈希容器，效率不如关联式容器
		for (auto iter = my_uMap.begin(); iter != my_uMap.end(); ++iter)
		{	
				//pair 类型键值对分为 2 部分
				cout << iter->first << " " << iter->second << endl;
		}
	return 0;
}